package academia.persistencia;

import academia.gui.TelaAtendente;
import academia.gui.TelaGerente;
import academia.gui.TelaInstrutor;
import academia.pessoal.Atendente;
import academia.pessoal.Cliente;
import academia.pessoal.Gerente;
import academia.pessoal.Instrutor;
import academia.pessoal.Pessoa;
import academia.pessoal.Treino;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.table.TableModel;
import net.proteanit.sql.DbUtils;


public class PessoaDAO {

    private static int id = 0;
    private int resp;

    public static int getId() {
        return id;
    }

    public static void setId(int id) {
        PessoaDAO.id = id;

    }
    private TableModel pessoa;

    public boolean cadastro(Pessoa pessoa, String tipo) {

        Connection conn = null;
        PreparedStatement ps = null;

        conn = DBAcademia.ConnectDB();
        try {
            String sql = "INSERT INTO Pessoa(Nome,CPF,CEP,Cidade,Bairro,Endereco,Senha,Telefone,Nascimento,Tipo,CREF,Pagamento) VALUES(?,?,?,?,?,?,?,?,?,?,?,?)";
            ps = conn.prepareStatement(sql);
            fillCadastro(pessoa, tipo, ps);

            if (tipo.equals("Cliente")) {
                Cliente cliente;
                cliente = (Cliente) pessoa;
                ps.setBoolean(11, cliente.getPagamento());
            } else if (tipo.equals("Instrutor")) {
                Instrutor instrutor;
                instrutor = (Instrutor) pessoa;
                ps.setInt(12, instrutor.getCref());
            }

            ps.executeUpdate();
            return true;

        } catch (SQLException ex) {
            Logger.getLogger(PessoaDAO.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        } finally {
            close(ps, conn, null);
        }
    }

    public void fillCadastro(Pessoa pessoa, String tipo, PreparedStatement ps) throws SQLException {
        ps.setString(1, pessoa.getNome());
        ps.setString(2, pessoa.getCpf());
        ps.setString(3, pessoa.getCep());
        ps.setString(4, pessoa.getCidade());
        ps.setString(5, pessoa.getBairro());
        ps.setString(6, pessoa.getEndereco());
        ps.setString(7, pessoa.getSenha());
        ps.setString(8, pessoa.getTelefone());
        ps.setString(9, pessoa.getNascimento());
        ps.setString(10, tipo);
    }

    public boolean excluir(int id) {
        Connection conn = null;
        PreparedStatement ps = null;
        conn = DBAcademia.ConnectDB();
        boolean val;

        try {
            String sql = "DELETE from Pessoa where IDpessoa='" + id + "'";
            ps = conn.prepareStatement(sql);
            ps.executeUpdate();
            val = true;

        } catch (SQLException a) {
            val = false;

        } finally {
            close(ps, conn, null);
        }
        return val;
    }

    public boolean editar(Pessoa pessoa, String tipo, int id) {
        Connection conn = null;
        PreparedStatement ps = null;
        conn = DBAcademia.ConnectDB();
        try {
            String sql = "UPDATE Pessoa SET Nome='" + pessoa.getNome() + "',"
                    + " CPF='" + pessoa.getCpf() + "',"
                    + " CEP='" + pessoa.getCep() + "',"
                    + "Cidade='" + pessoa.getCidade() + "',"
                    + "Bairro='" + pessoa.getBairro() + "',"
                    + "Endereco='" + pessoa.getEndereco() + "',"
                    + "Senha='" + pessoa.getSenha() + "',"
                    + "Telefone='" + pessoa.getTelefone() + "',"
                    + "Nascimento='" + pessoa.getNascimento() + "'"
                    + " WHERE IDpessoa='" + id + "'";

            ps = conn.prepareStatement(sql);
            ps.executeUpdate();
            ps.close();
            if (tipo.equals("Cliente")) {
                Cliente cliente;
                cliente = (Cliente) pessoa;
                String sql2 = "UPDATE Pessoa SET Pagamento='" + cliente.getPagamento() + "'WHERE IDpessoa ='" + id + "'";
                ps = conn.prepareStatement(sql2);
                ps.executeUpdate();
            } else if (tipo.equals("Instrutor")) {
                Instrutor instrutor;
                instrutor = (Instrutor) pessoa;
                String sql3 = "UPDATE Pessoa SET CREF='" + instrutor.getCref() + "'WHERE IDpessoa ='" + id + "'";
                ps = conn.prepareStatement(sql3);
                ps.executeUpdate();
            }

            return true;

        } catch (SQLException e) {
            e.printStackTrace();
            return false;
        } finally {
            close(ps, conn, null);
        }
    }

    public int login(String login, String senha) {
        
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        conn = DBAcademia.ConnectDB();

        String sql = "SELECT Tipo,IDpessoa,Nome FROM Pessoa WHERE CPF=? and Senha=?";
        try {
            ps = conn.prepareStatement(sql);
            ps.setString(1, login);
            ps.setString(2, senha);
            rs = ps.executeQuery();
            if (rs.next()) {
                String Tipo = rs.getString("Tipo");
                if (Tipo.equals("Gerente")) {
                    new TelaGerente().setVisible(true); //falta fazer tela cliente
                    resp= 1;
                } else if (Tipo.equals("Atendente")) {
                    new TelaAtendente().setVisible(true);
                    resp= 2;
                } else if (Tipo.equals("Instrutor")) {
                    new TelaInstrutor().setVisible(true);
                    Treino treino = new Treino();
                    treino.setIdInstrutor(rs.getInt("Idpessoa"));
                    treino.setNomeInstrutor(rs.getString("Nome"));
                    resp= 3;
                } else if (Tipo.equals("Cliente")) {
                    new TelaAtendente().setVisible(true);
                    Treino treino = new Treino();
                    treino.setIdCliente(rs.getInt("Idpessoa"));
                    resp= 4;
                }
            }
        } catch (SQLException e) {
            Logger.getLogger(PessoaDAO.class.getName()).log(Level.SEVERE, null, e);
            resp= 0;
        } finally {
            close(ps, conn, null);

        }return resp;
        
    }
    private void close(PreparedStatement ps, Connection conn, ResultSet rs) {
        RuntimeException r = null;
        if (ps != null) {
            try {
                ps.close();
            } catch (SQLException ex) {
                r = new RuntimeException(ex);
                Logger.getLogger(PessoaDAO.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException ex) {
                r = new RuntimeException(ex);
                Logger.getLogger(PessoaDAO.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException ex) {
                r = new RuntimeException(ex);
                Logger.getLogger(PessoaDAO.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        if (r != null) {
            throw r;
        }
    }

    public TableModel buscar(String cpf) {
        TableModel result = null;
        Connection conn = null;
        ResultSet rs = null;
        PreparedStatement ps = null;
        conn = DBAcademia.ConnectDB();

        try {
            String sql = "SELECT * FROM Pessoa WHERE CPF ='" + cpf + "'";

            ps = conn.prepareStatement(sql);
            rs = ps.executeQuery();
            result = DbUtils.resultSetToTableModel(rs);



        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            close(ps, conn, rs);
        }
        return result;

    }

    public String buscar(int id) {
        
        Connection conn = null;
        ResultSet rs = null;
        PreparedStatement ps = null;
        conn = DBAcademia.ConnectDB();

        try {
            String sql = "SELECT Nome FROM Pessoa WHERE IDpessoa ='" + id + "'";

            ps = conn.prepareStatement(sql);
            rs = ps.executeQuery();
            return rs.getString("Nome");

        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            close(ps, conn, rs);
        }
        

    }

    public TableModel listar(String tipo) {
        TableModel result = null;
        Connection conn = null;
        ResultSet rs = null;
        PreparedStatement ps = null;
        conn = DBAcademia.ConnectDB();

        try {
            String sql = "SELECT * FROM Pessoa WHERE Tipo='" + tipo + "'";
            ps = conn.prepareStatement(sql);
            rs = ps.executeQuery();
            result = DbUtils.resultSetToTableModel(rs);
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            close(ps, conn, rs);
        }
        return result;
    }

    public Pessoa RetornaObjeto(Pessoa pessoa, int id, String tipo) {
        Connection conn = null;
        ResultSet rs = null;
        PreparedStatement ps = null;
        conn = DBAcademia.ConnectDB();

        try {
            String sql = "SELECT * FROM Pessoa WHERE IDpessoa='" + id + "'";
            ps = conn.prepareStatement(sql);
            rs = ps.executeQuery();

            pessoa.setNome(rs.getString("Nome"));
            pessoa.setCpf(rs.getString("CPF"));
            pessoa.setCep(rs.getString("CEP"));
            pessoa.setCidade(rs.getString("Cidade"));
            pessoa.setEndereco(rs.getString("Endereco"));
            pessoa.setBairro(rs.getString("Bairro"));
            pessoa.setSenha(rs.getString("Senha"));
            pessoa.setTelefone(rs.getString("Telefone"));
            pessoa.setNascimento(rs.getString("Nascimento"));
            if (tipo.equals("Cliente")) {
                Cliente cliente;
                cliente = (Cliente) pessoa;
                cliente.setPagamento(rs.getBoolean("Pagamento"));
                pessoa = cliente;
            } else if (tipo.equals("Instrutor")) {
                Instrutor instrutor;
                instrutor = (Instrutor) pessoa;
                instrutor.setCref(rs.getInt("CREF"));
                pessoa = instrutor;
            } else if (tipo.equals("Atendente")) {
                Atendente atendente = new Atendente();
                atendente = (Atendente) pessoa;
                pessoa = atendente;
            } else {
                Gerente gerente = new Gerente();
                gerente = (Gerente) pessoa;
            }

        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            close(ps, conn, rs);
        }



        return pessoa;


    }

//    public Pessoa RetornaObjeto(int id, String tipo) {
//        Connection conn = null;
//        ResultSet rs = null;
//        PreparedStatement ps = null;
//        conn = DBAcademia.ConnectDB();
//        Pessoa retorno=null;
//        
//        try {
//            String sql = "SELECT * FROM Pessoa WHERE IDpessoa='" + id + "'";
//            ps = conn.prepareStatement(sql);
//            rs = ps.executeQuery();
//            Pessoa pessoa = null;
//            
//            
//            pessoa.setNome(rs.getString("Nome"));
//            pessoa.setCpf(rs.getString("CPF"));
//            pessoa.setCep(rs.getString("CEP"));
//            pessoa.setCidade(rs.getString("Cidade"));
//            pessoa.setEndereco(rs.getString("Endereco"));
//            pessoa.setBairro(rs.getString("Bairro"));
//            pessoa.setSenha(rs.getString("Senha"));
//            pessoa.setTelefone(rs.getString("Telefone"));
//            pessoa.setNascimento(rs.getString("Nascimento"));
//            if (tipo.equals("Cliente")) {
//                Cliente cliente;
//                cliente = (Cliente) pessoa;
//                cliente.setPagamento(rs.getBoolean("Pagamento"));
//                retorno=cliente;
//            } else if (tipo.equals("Instrutor")) {
//                Instrutor instrutor;
//                instrutor = (Instrutor) pessoa;
//                instrutor.setCref(rs.getInt("CREF"));
//                retorno=instrutor;
//            } else if (tipo.equals("Atendente")) {
//                Atendente atendente = new Atendente();
//                atendente = (Atendente) pessoa;
//                retorno=atendente;
//
//            } else {
//                Gerente gerente = new Gerente();
//                gerente = (Gerente) pessoa;
//                retorno=gerente;
//            }
//            
//        } catch (SQLException e) {
//            throw new RuntimeException(e);
//        } finally {
//            close(ps, conn, rs);
//        }
//
//
//        return retorno ;
//
//
//
//    }
}
